import dayjs from 'dayjs';

const filters = {
  /**
   * 保留两位小数
   * @param {number} value - 需要处理的数字
   * @returns {string} - 保留两位小数的字符串
   */
  toFix(value = 0) {
    return value.toFixed(2);
  },

  /**
   * 将值转换为字符串
   * @param {any} value - 需要处理的值
   * @returns {string} - 转换后的字符串
   */
  toStr(value) {
    return value.toString();
  },

  /**
   * 将值转换为数字
   * @param {any} value - 需要处理的值
   * @returns {number} - 转换后的数字
   */
  toNum(value) {
    return Number(value);
  },

  /**
   * 将日期值格式化为YYYY/MM/dd
   * @param {string|number|Date} value - 需要处理的日期
   * @returns {string} - 格式化后的日期字符串
   */
  toTimeByDay(value) {
    return dayjs(value).format('YYYY/MM/DD');
  }
};

/**
 * 将数字格式化为两位字符串
 * @param {number} n - 需要处理的数字
 * @returns {string} - 格式化后的字符串
 */
const formatNumber = (n) => {
  return n.toString().padStart(2, '0');
};

/**
 * 获取正则表达式
 * @param {string} pattern - 正则表达式模式
 * @param {string} flags - 正则表达式标志
 * @returns {RegExp} - 返回的正则表达式对象
 */
const getRegExp = (pattern, flags) => {
  return new RegExp(pattern, flags);
};

/**
 * 根据格式化字符串格式化日期
 * @param {number|string|Date} timestamp - 需要处理的时间戳或日期字符串
 * @param {string} [format='yyyy-MM-dd hh:mm:ss'] - 格式化字符串
 * @returns {string} - 格式化后的日期字符串
 */
const dateFormat = (timestamp, format = 'yyyy-MM-dd hh:mm:ss') => {
  const realDate = new Date(parseInt(timestamp));
  const timeFormat = (num) => (num < 10 ? '0' + num : num);

  const date = [
    ['M+', timeFormat(realDate.getMonth() + 1)],
    ['d+', timeFormat(realDate.getDate())],
    ['h+', timeFormat(realDate.getHours())],
    ['m+', timeFormat(realDate.getMinutes())],
    ['s+', timeFormat(realDate.getSeconds())],
    ['q+', Math.floor((realDate.getMonth() + 3) / 3)],
    ['S+', realDate.getMilliseconds()]
  ];

  if (/(y+)/i.test(format)) {
    format = format.replace(RegExp.$1, (realDate.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  date.forEach(([k, v]) => {
    if (new RegExp(`(${k})`).test(format)) {
      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? v : ('00' + v).substr(('' + v).length));
    }
  });
  return format;
};

/**
 * 将日期字符串解析为时间戳
 * @param {string} fmt - 需要处理的日期字符串
 * @returns {number} - 解析后的时间戳
 */
const parse = (fmt) => {
  const fmt1 = fmt.substring(0, 19);
  const reg = getRegExp('-', 'g');
  const fmt2 = fmt1.replace(reg, '/');
  return new Date(fmt2).getTime();
};

export default {
  toFix: filters.toFix,
  toStr: filters.toStr,
  toNum: filters.toNum,
  toTimeByDay: filters.toTimeByDay,
  formatNumber,
  dateFormat,
  parse
};
